package at.horario.dao.hibernate;

import at.horario.dao.CelulaDao;
import at.horario.model.Celula;
import at.horario.model.Horario;
import org.hibernate.criterion.DetachedCriteria;
import static org.hibernate.criterion.DetachedCriteria.forClass;
import static org.hibernate.criterion.Expression.*;
import static org.hibernate.criterion.Projections.rowCount;

import java.util.List;

public class CelulaDaoHibernate extends GenericDaoHibernate<Celula, Long> implements CelulaDao {
    public CelulaDaoHibernate() {
        super(Celula.class);
    }

    public List<Celula> getCelulas(Horario horario, int first, int count) {
        DetachedCriteria criteria = forClass(Celula.class);
        criteria.add(eq("horario", horario)).createAlias("professor", "professor")
                .add(ge("professor.numHorario", first + 1))
                .add(le("professor.numHorario", first + count));
        return super.getHibernateTemplate().findByCriteria(criteria);
    }

    public Integer countCelulas(Horario horario) {
        DetachedCriteria criteria = forClass(Celula.class);
        criteria.add(eq("horario", horario));
        criteria.setProjection(rowCount());
        return (Integer) super.getHibernateTemplate().findByCriteria(criteria).get(0);
    }

    public List<Celula> getCelulas(Horario horario, Integer professorNum) {
        DetachedCriteria criteria = forClass(Celula.class);
        criteria.add(eq("horario", horario));
        criteria.add(eq("professor.professorNum", professorNum));
        return super.getHibernateTemplate().findByCriteria(criteria);
    }
}